package com.qkjia.springselltest.exdemo;

import javafx.beans.binding.When;
import org.jline.builtins.Commands;
import org.springframework.shell.Availability;
import org.springframework.shell.standard.ShellCommandGroup;
import org.springframework.shell.standard.ShellComponent;
import org.springframework.shell.standard.ShellMethod;
import org.springframework.shell.standard.ShellMethodAvailability;

import javax.swing.*;
import java.util.Calendar;

import static java.util.Calendar.DAY_OF_WEEK;
import static java.util.Calendar.SUNDAY;

/**
 * value()属性的默认值是"*"，这是一个匹配所有命令名的特殊通配符。 因此，很容易使用单个可用性方法来打开或关闭单个类的所有命令。 下面是一个例子:
 */
@ShellComponent
public class Toggles {
    @ShellMethodAvailability
    public Availability availabilityOnWeekdays() {
        return Calendar.getInstance().get(DAY_OF_WEEK) == SUNDAY   //等于 星期天
                ? Availability.available()
                : Availability.unavailable("today is not Sunday");
    }

    @ShellMethod("Bu 不写我怕报错 .")//方法注释  ，推荐已大写字母开头 ， 。结尾
    public void foo() {}

    @ShellMethod("Bu 不写我怕报错 .")//方法注释  ，推荐已大写字母开头 ， 。结尾
    public void bar() {}

    //Spring Shell没有对如何编写命令和如何组织类施加太多约束。 但是将相关命令放在同一个类中通常是一种良好的实践，可用性指示器可以从中受益。



 /*    输入 help
  组织命令 当你的 shell 开始提供很多功能时，你可能会得到很多命令，这可能会让你的用户感到困惑。
    输入帮助他们会看到一个令人生畏的命令列表，按字母顺序组织，这可能并不总是有意义。
    为了缓解这种情况，Spring Shell 提供了将命令组合在一起的能力，并具有合理的默认值。然后相关的命令将在同一组中结束（例如用户管理命令）
    并一起显示在帮助屏幕和其他地方。默认情况下，命令将根据它们实现的类进行分组，将驼峰式类名称转换为单独的单词
    （因此 URLRelatedCommands 成为 URL 相关命令）。这是一个非常明智的默认设置，因为相关命令通常已经在类中，
    因为它们需要使用相同的协作对象。但是，如果此行为不适合您，您可以通过以下方式按优先级覆盖命令的组：
    在 @ShellMethod 注释中指定 group() 将 @ShellCommandGroup 放在定义命令的类上. 这将应用该类中定义的所有命令的组（除非如上所述覆盖）
    在包上放置一个@ShellCommandGroup（通过 package-info.java）命令定义。这将适用于包中定义的所有命令（除非如上所述在方法或类级别覆盖）这是一个简短的示例：*/

/*    public class UserCommands {
//        @ShellMethod(group = {})
        @ShellCommand(value = "This command ends up in the 'User Commands' group")
        public void foo() {}

        @ShellCommand(value = "This command ends up in the 'Other Commands' group",
                group = "Other Commands")
        public void bar() {}
    }*/


    @ShellCommandGroup("Other Commands")
    public class SomeCommands {
        @ShellMethod(value = "This one is in 'Other Commands'")
        public void wizz() {}

        @ShellMethod(value = "And this one is 'Yet Another Group'",
                group = "Yet Another Group")
        public void last() {}
    }

    /*运行一批命令 脚本命令接受一个本地文件作为参数，并将重放在那里找到的命令，一次一个。
    从文件中读取的行为与交互式 shell 中的行为完全相同，因此以 // 开头的行将被视为注释并被忽略，而以 \ 结尾的行将触发行继续。*/

    /**
     * 自定义外壳
     * 覆盖或禁用内置命令
     * Spring Shell提供了内置命令来实现许多Shell应用程序(如果不是所有的话)需要的日常任务。 如果您不满意它们的行为方式，您可以禁用或覆盖它们，如本节所述。
     *
     * 禁用所有内置命令
     * 如果你根本不需要内置命令，那么有一个简单的方法来“禁用”它们:不要包含它们! 要么对Spring - Shell标准命令使用maven排除，要么
     * ，如果您有选择地包括Spring Shell依赖项，不要引入它!
     *
     * <dependency>
     *     <groupId>org.springframework.shell</groupId>
     *     <artifactId>spring-shell-starter</artifactId>
     *     <version>2.0.0.RELEASE</version>
     *     <exclusions>
     *         <exclusion>
     *             <groupId>org.springframework.shell</groupId>
     *             <artifactId>spring-shell-standard-commands</artifactId>
     *         </exclusion>
     *     </exclusion>
     * </dependency>
     */

    /**
     * 禁用特定命令
     * 要禁用单个内置命令，只需在应用环境中将spring.shell.command.<command>.enabled属性设置为false。
     * 一个简单的方法是在main()入口点传递额外的参数到Boot应用程序:
     */

}